{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "----\n",
    "In this assignment, you will convert your batch least squares solution to a recursive one! Recall that you have the following data:\n",
    "\n",
    "| Current (A) | Voltage (V) |\n",
    "|-------------|-------------|\n",
    "| 0.2         | 1.23        |\n",
    "| 0.3         | 1.38        |\n",
    "| 0.4         | 2.06        |\n",
    "| 0.5         | 2.47        |\n",
    "| 0.6         | 3.17        |\n",
    "\n",
    "This time, you will be fitting a linear model which includes an offset, $y = Rx + b$. If Ohm's law ($V = RI$) holds, we expect this offset to be near zero.\n",
    "\n",
    "You will set the initial parameters with the assumption that your prior estimate of the resistance $R = 4$ is not very good. Also, since you are fairly certain that Ohm's law ($V = RI$) does, in fact, hold, it is safe to assume with high confidence that the offset term $b$ will be close to zero. Initialize the estimator as follows:\n",
    "\n",
    "$$\\hat{R} \\sim \\mathcal{N}(4, 10.0), \\hat{b} \\sim \\mathcal{N}(0, 0.2)$$\n",
    "\n",
    "You can assume that we know the current perfectly, and that the voltage measurements are corrupted by additive, independent and identitically distributed Gaussian noise with variance $0.0225 ~ V^2$.\n",
    "\n",
    "## Getting Started\n",
    "----\n",
    "As before, load the current and voltge measurements into numpy arrays and plot the values:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from numpy.linalg import inv\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "I = np.array([0.2, 0.3, 0.4, 0.5, 0.6])\n",
    "V = np.array([1.23, 1.38, 2.06, 2.47, 3.17])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(I, V)\n",
    "\n",
    "plt.xlabel('current (A)')\n",
    "plt.ylabel('voltage (V)')\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Estimating the Parameters\n",
    "----\n",
    "### Batch Estimator\n",
    "Before implementing recursive least squares, let's review the parameter estimate given by the batch least squares method used in the previous assignment. This time, you will be fitting a model which contains an offset $y = Rx + b$. We can use this result later for comparison."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The parameters of the line fit are ([R, b]):\n",
      "[4.97  0.074]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## Batch Solution\n",
    "H = np.ones((5,2))\n",
    "H[:, 0] = I\n",
    "x_ls = inv(H.T.dot(H)).dot(H.T.dot(V))\n",
    "print('The parameters of the line fit are ([R, b]):')\n",
    "print(x_ls)\n",
    "\n",
    "#Plot\n",
    "I_line = np.arange(0, 0.8, 0.1)\n",
    "V_line = x_ls[0]*I_line + x_ls[1]\n",
    "\n",
    "plt.scatter(I, V)\n",
    "plt.plot(I_line, V_line)\n",
    "plt.xlabel('current (A)')\n",
    "plt.ylabel('voltage (V)')\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As expected, the offset parameter $\\hat{b}$ is near zero, while $\\hat{R}$ closely approximates the true resistance value of $R = 5~\\Omega$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Recursive Estimator\n",
    "Now try to implement the least squares method recursively! Recall the steps described in Module 1, Lesson 2 - \"Recursive Least Squares\": \n",
    "\n",
    "**Initialize the parameter and covariance estimates**:\n",
    "\n",
    "----\n",
    "$$\n",
    "\\hat{\\mathbf{x}}_0 = E\\left[\\mathbf{x}\\right] \\,\\,\\, , \\,\\,\\, \\mathbf{P}_0 = E\\left[(\\mathbf{x} - \\hat{\\mathbf{x}}_0)(\\mathbf{x} - \\hat{\\mathbf{x}}_0)^T\\right]\n",
    "$$\n",
    "\n",
    "**For every measurement k**:\n",
    "\n",
    "----\n",
    "  * Calculate the correction gain $$\\mathbf{K}_k = \\mathbf{P}_{k-1}\\mathbf{H}_k^T\\left(\\mathbf{H}_k\\mathbf{P}_{k-1}\\mathbf{H}_k^T + \\mathbf{R}_k\\right)^{-1}$$\n",
    "  * Update the parameter estimate $$\\hat{\\mathbf{x}}_k = \\hat{\\mathbf{x}}_{k-1} + \\mathbf{K}_k\\left(\\mathbf{y}_k - \\mathbf{H}_k\\hat{\\mathbf{x}}_{k-1}\\right)$$\n",
    "  * Update the covariance estimate $$\\mathbf{P}_k = \\left(\\mathbf{I} - \\mathbf{K}_k\\mathbf{H}_k\\right)\\mathbf{P}_{k-1}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The parameters of the line fit are ([R, b]):\n",
      "[5.04783381 0.04192321]\n"
     ]
    }
   ],
   "source": [
    "## Recursive solution\n",
    "ident_matrix = np.eye(2,2)\n",
    "#Initialize the 2x2 covaraince matrix\n",
    "# P_k = ...\n",
    "P_k = np.array([[4, 10.0], [0, 0.2]])\n",
    "#Initialize the parameter estimate x\n",
    "# x_k = ...\n",
    "x_k = np.array([4.0, 0.0])\n",
    "#Our measurement variance\n",
    "Var = 0.0225\n",
    "\n",
    "#Pre allocate our solutions so we can save the estimate at every step\n",
    "num_meas = I.shape[0]\n",
    "x_hist = np.zeros((num_meas + 1,2))\n",
    "P_hist = np.zeros((num_meas + 1,2,2))\n",
    "\n",
    "x_hist[0] = x_k\n",
    "P_hist[0] = P_k\n",
    "\n",
    "#Iterate over the measurements\n",
    "for k in range(num_meas):\n",
    "    #Construct H_k\n",
    "    # H_k = ...\n",
    "    H_k = np.array([[I[k], 1.0]])\n",
    "    #Construct K_k\n",
    "    # K_k = ...\n",
    "    K_k = np.dot(P_k , np.dot(H_k.transpose() , inv(np.dot(H_k,np.dot(P_k,H_k.transpose())) + Var)))\n",
    "    #Update our estimate\n",
    "    # x_k = ...\n",
    "    x_k = x_k + np.dot(K_k,(V[k]-np.dot(H_k,x_k)))\n",
    "    #Update our uncertainty\n",
    "    # P_k = ...\n",
    "    P_k = np.dot((np.eye(2,2)-np.dot(K_k,H_k)),P_k)\n",
    "    #Keep track of our history\n",
    "    P_hist[k+1] = P_k\n",
    "    x_hist[k+1] = x_k\n",
    "    \n",
    "print('The parameters of the line fit are ([R, b]):')\n",
    "print(x_k)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plotting the Results\n",
    "----\n",
    "Let's plot out the solutions at every step. Does the value converge towards the batch least squares solution from the previous assignment?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Plot\n",
    "plt.scatter(I, V, label='Data')\n",
    "plt.plot(I_line, V_line, label='Batch Solution')\n",
    "plt.xlabel('current (A)')\n",
    "plt.ylabel('voltage (V)')\n",
    "plt.grid(True)\n",
    "\n",
    "I_line = np.arange(0, 0.8, 0.1)\n",
    "for k in range(num_meas):\n",
    "    V_line = x_hist[k,0]*I_line + x_hist[k,1]\n",
    "    plt.plot(I_line, V_line, label='Measurement {}'.format(k))\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The resistance estimate does approach the true resistance value of $R = 5~\\Omega$. Try modifying the initialization values (e.g., the intial uncertainty) - can you get a better final estimate?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
